package com.cskaoyan.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 创建日期: 2023/01/07 15:23
 *
 * @author ciggar
 */
// 如果需要实现自己的过滤器，那么需要实现两个接口

// 1. MyFilter的作用范围？ 因为MyFilter实现了GlobalFilter接口，那么会过滤所有匹配上的请求

@Component
public class MyFilter implements GlobalFilter, Ordered {

    // 过滤的方法
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        // 比如，我们目前的过滤器的逻辑是：
        // 1. 从请求的cookie中取出一个叫 access_token的cookie
        // 如果能取到，那么放行
        // 如果取不到，那么不放行


        // 获取request
        ServerHttpRequest request = exchange.getRequest();

        // 获取request中所有的cookie
        MultiValueMap<String, HttpCookie> cookies = request.getCookies();

        // 从cookies中，获取一个名字叫做access_token的cookie
        HttpCookie accessToken = cookies.getFirst("access_token");

        if (accessToken == null) {
            // 拦截
            throw new RuntimeException("没有获取到 accessToken！");
        }
        // 放行
        return chain.filter(exchange);
    }


    // 2. getOrder方法返回值的作用：
          // 这个方法的返回值，就决定了这个过滤器在过滤器链中的位置
          // 返回值越小，优先级越高，在过滤器链中就越靠前
    @Override
    public int getOrder() {
        return 0;
    }
}
